{
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "# 线性回归\n",
    "\n",
    "## 使用Numpy完成线性回归\n",
    "> https://github.com/fengdu78/WZU-machine-learning-course/tree/main/code/lesson2-code\n",
    "\n",
    "### 单变量线性回归\n"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus']=False #用来正常显示负号"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "outputs": [],
   "source": [
    "# 准备数据\n",
    "SIZE = 100\n",
    "# x_train = np.random.random((SIZE,1))\n",
    "# y_train = x_train * 3 + (np.random.random((SIZE,1)) -0.5) * 0.001\n",
    "data = pd.DataFrame(np.random.random((SIZE, 2)), columns=['X',\"Y\"])\n",
    "data['Y'] =  data['X'] * 3 + (np.random.random() -0.5) * 0.1"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "# 读取数据\n",
    "path = 'data/regress_data1.csv'\n",
    "data = pd.read_csv(path)\n",
    "data.head()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "outputs": [
    {
     "data": {
      "text/plain": "               X          Y\ncount  50.000000  50.000000\nmean    0.502827   1.513401\nstd     0.311373   0.934118\nmin     0.001129   0.008305\n25%     0.237821   0.718381\n50%     0.504825   1.519394\n75%     0.801462   2.409304\nmax     0.986504   2.964431",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>X</th>\n      <th>Y</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>count</th>\n      <td>50.000000</td>\n      <td>50.000000</td>\n    </tr>\n    <tr>\n      <th>mean</th>\n      <td>0.502827</td>\n      <td>1.513401</td>\n    </tr>\n    <tr>\n      <th>std</th>\n      <td>0.311373</td>\n      <td>0.934118</td>\n    </tr>\n    <tr>\n      <th>min</th>\n      <td>0.001129</td>\n      <td>0.008305</td>\n    </tr>\n    <tr>\n      <th>25%</th>\n      <td>0.237821</td>\n      <td>0.718381</td>\n    </tr>\n    <tr>\n      <th>50%</th>\n      <td>0.504825</td>\n      <td>1.519394</td>\n    </tr>\n    <tr>\n      <th>75%</th>\n      <td>0.801462</td>\n      <td>2.409304</td>\n    </tr>\n    <tr>\n      <th>max</th>\n      <td>0.986504</td>\n      <td>2.964431</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.describe()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "使用matplotlib 看下数据长什么样子"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 864x576 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "data.plot(kind='scatter', x='X', y='Y', figsize=(12,8))\n",
    "plt.xlabel('X', fontsize=18)\n",
    "plt.ylabel('Y', rotation=0, fontsize=18)\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "现在让我们使用梯度下降来实现线性回归，以最小化代价函数。"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "首先，我们将创建一个以参数$w$为特征函数的代价函数\n",
    "\n",
    "$$J\\left( w  \\right)=\\frac{1}{2m}\\sum\\limits_{i=1}^{m}{{{\\left( {{h}}\\left( {{x}^{(i)}} \\right)-{{y}^{(i)}} \\right)}^{2}}}$$\n",
    "\n",
    "其中：\\\\[{{h}}\\left( x \\right)={{w}^{T}}X={{w }_{0}}{{x}_{0}}+{{w }_{1}}{{x}_{1}}+{{w }_{2}}{{x}_{2}}+...+{{w }_{n}}{{x}_{n}}\\\\]"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "outputs": [],
   "source": [
    "def compute_cost(X, y, w):\n",
    "    inner = np.power(((X * w.T) - y), 2)# (m,n) @ (n, 1) -> (n, 1)\n",
    "#     return np.sum(inner) / (2 * len(X))\n",
    "    return np.sum(inner) / (2 * X.shape[0])"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "让我们在训练集中添加一列，以便我们可以使用向量化的解决方案来计算代价和梯度。"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   Ones         X         Y\n",
      "0     1  0.809773  2.422526\n",
      "1     1  0.913342  2.733234\n",
      "2     1  0.192700  0.571307\n",
      "3     1  0.836752  2.503464\n",
      "4     1  0.890153  2.663667\n"
     ]
    }
   ],
   "source": [
    "data.insert(0, 'Ones', 1)\n",
    "print(data.head())"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "现在我们来做一些变量初始化。"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "outputs": [],
   "source": [
    "# set X (training data) and y (target variable)\n",
    "cols = data.shape[1]\n",
    "X = data.iloc[:,:cols-1]#X是所有行，去掉最后一列\n",
    "y = data.iloc[:,cols-1:]#X是所有行，最后一列"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "outputs": [
    {
     "data": {
      "text/plain": "   Ones         X\n0     1  0.809773\n1     1  0.913342\n2     1  0.192700\n3     1  0.836752\n4     1  0.890153",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>Ones</th>\n      <th>X</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1</td>\n      <td>0.809773</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1</td>\n      <td>0.913342</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>1</td>\n      <td>0.192700</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>1</td>\n      <td>0.836752</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>1</td>\n      <td>0.890153</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.head()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "outputs": [
    {
     "data": {
      "text/plain": "          Y\n0  2.422526\n1  2.733234\n2  0.571307\n3  2.503464\n4  2.663667",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>Y</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>2.422526</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2.733234</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>0.571307</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>2.503464</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>2.663667</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.head()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "代价函数是应该是numpy矩阵，所以我们需要转换X和Y，然后才能使用它们。 我们还需要初始化w。"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0 0]]\n"
     ]
    }
   ],
   "source": [
    "X = np.matrix(X.values)\n",
    "y = np.matrix(y.values)\n",
    "w = np.matrix(np.array([0,0]))\n",
    "print(w) # w 是一个(1,2)矩阵"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(100, 2) (1, 2) (100, 1)\n"
     ]
    }
   ],
   "source": [
    "print(X.shape, w.shape, y.shape)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "计算代价函数 (theta初始值为0)."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "初始参数下的代价值 1.4880983086305348\n"
     ]
    }
   ],
   "source": [
    "cost = compute_cost(X, y, w)\n",
    "print('初始参数下的代价值', cost)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "# Batch Gradient Decent（批量梯度下降）\n",
    "\n",
    "$${{w }_{j}}:={{w }_{j}}- \\alpha \\frac{1}{m}\\sum\\limits_{i=1}^m \\frac{\\partial }{\\partial {{w}_{j}}}J\\left( w \\right)$$"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "outputs": [],
   "source": [
    "def batch_gradient_descent(X, y, w, alpha, iters):\n",
    "    temp = np.matrix(np.zeros(w.shape))\n",
    "    parameters = int(w.ravel().shape[1])\n",
    "    cost = np.zeros(iters)\n",
    "\n",
    "    for i in range(iters):\n",
    "        error = (X * w.T) - y\n",
    "\n",
    "        for j in range(parameters):\n",
    "            term = np.multiply(error, X[:, j])\n",
    "            temp[0, j] = w[0, j] - ((alpha / len(X)) * np.sum(term))\n",
    "\n",
    "        w = temp\n",
    "        cost[i] = compute_cost(X, y, w)\n",
    "\n",
    "    return w, cost"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "初始化一些附加变量 - 学习速率α和要执行的迭代次数。"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "outputs": [],
   "source": [
    "alpha = 0.01\n",
    "iters = 1000"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "source": [
    "# 运行梯度下降算法来将我们的参数θ适合于训练集。\n",
    "g, cost = batch_gradient_descent(X, y, w, alpha, iters)\n",
    "# print(g, cost)\n",
    "print('训练后参数：', g)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "execution_count": 37,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.61853096 1.82565681]] [1.45646782 1.42562398 1.39554702 1.36621771 1.33761726 1.30972739\n",
      " 1.28253025 1.25600845 1.23014503 1.20492348 1.18032767 1.1563419\n",
      " 1.13295085 1.1101396  1.08789359 1.06619863 1.0450409  1.0244069\n",
      " 1.00428349 0.98465786 0.96551751 0.94685026 0.92864424 0.91088787\n",
      " 0.89356987 0.87667924 0.86020524 0.84413744 0.82846563 0.81317987\n",
      " 0.79827048 0.78372802 0.76954327 0.75570727 0.74221126 0.72904671\n",
      " 0.7162053  0.70367894 0.69145971 0.67953991 0.66791203 0.65656875\n",
      " 0.64550292 0.63470759 0.62417598 0.61390146 0.6038776  0.5940981\n",
      " 0.58455683 0.57524783 0.56616527 0.55730346 0.54865688 0.54022013\n",
      " 0.53198795 0.5239552  0.5161169  0.50846815 0.50100422 0.49372048\n",
      " 0.48661239 0.47967557 0.47290572 0.46629865 0.45985029 0.45355665\n",
      " 0.44741387 0.44141817 0.43556585 0.42985332 0.4242771  0.41883375\n",
      " 0.41351996 0.40833247 0.40326813 0.39832385 0.39349663 0.38878353\n",
      " 0.3841817  0.37968835 0.37530077 0.37101631 0.36683239 0.36274649\n",
      " 0.35875616 0.35485901 0.35105272 0.347335   0.34370364 0.34015648\n",
      " 0.33669142 0.3333064  0.32999942 0.32676854 0.32361184 0.32052749\n",
      " 0.31751365 0.31456859 0.31169057 0.30887793 0.30612903 0.30344227\n",
      " 0.30081612 0.29824905 0.29573959 0.2932863  0.29088778 0.28854266\n",
      " 0.28624962 0.28400735 0.28181459 0.27967011 0.27757269 0.27552117\n",
      " 0.2735144  0.27155127 0.26963069 0.26775161 0.26591298 0.26411381\n",
      " 0.2623531  0.26062991 0.2589433  0.25729236 0.25567621 0.25409397\n",
      " 0.25254481 0.2510279  0.24954244 0.24808766 0.24666279 0.24526709\n",
      " 0.24389983 0.24256032 0.24124785 0.23996177 0.23870141 0.23746615\n",
      " 0.23625536 0.23506843 0.23390477 0.23276381 0.23164498 0.23054775\n",
      " 0.22947157 0.22841593 0.22738032 0.22636424 0.22536722 0.22438878\n",
      " 0.22342847 0.22248583 0.22156044 0.22065187 0.21975971 0.21888354\n",
      " 0.21802299 0.21717766 0.21634719 0.2155312  0.21472935 0.21394129\n",
      " 0.21316667 0.21240517 0.21165648 0.21092027 0.21019624 0.20948409\n",
      " 0.20878355 0.20809431 0.20741611 0.20674867 0.20609174 0.20544507\n",
      " 0.20480839 0.20418148 0.20356408 0.20295598 0.20235694 0.20176676\n",
      " 0.20118521 0.20061208 0.20004717 0.19949029 0.19894125 0.19839984\n",
      " 0.1978659  0.19733923 0.19681967 0.19630705 0.1958012  0.19530196\n",
      " 0.19480917 0.19432267 0.19384233 0.19336798 0.1928995  0.19243673\n",
      " 0.19197955 0.19152783 0.19108143 0.19064022 0.1902041  0.18977293\n",
      " 0.1893466  0.188925   0.18850802 0.18809554 0.18768747 0.18728371\n",
      " 0.18688414 0.18648868 0.18609723 0.1857097  0.18532599 0.18494602\n",
      " 0.18456971 0.18419697 0.18382771 0.18346186 0.18309935 0.18274008\n",
      " 0.182384   0.18203103 0.1816811  0.18133414 0.18099009 0.18064888\n",
      " 0.18031044 0.17997471 0.17964165 0.17931117 0.17898324 0.17865779\n",
      " 0.17833476 0.17801411 0.17769579 0.17737974 0.17706591 0.17675425\n",
      " 0.17644473 0.17613729 0.17583189 0.17552848 0.17522703 0.17492749\n",
      " 0.17462982 0.17433398 0.17403994 0.17374765 0.17345708 0.1731682\n",
      " 0.17288097 0.17259536 0.17231133 0.17202885 0.17174789 0.17146843\n",
      " 0.17119042 0.17091384 0.17063867 0.17036487 0.17009242 0.16982129\n",
      " 0.16955146 0.1692829  0.16901559 0.1687495  0.16848461 0.1682209\n",
      " 0.16795834 0.16769692 0.16743661 0.1671774  0.16691926 0.16666217\n",
      " 0.16640611 0.16615107 0.16589703 0.16564397 0.16539187 0.16514072\n",
      " 0.1648905  0.16464119 0.16439278 0.16414525 0.16389859 0.16365279\n",
      " 0.16340782 0.16316368 0.16292036 0.16267783 0.16243609 0.16219513\n",
      " 0.16195493 0.16171547 0.16147676 0.16123877 0.1610015  0.16076494\n",
      " 0.16052907 0.16029389 0.16005938 0.15982554 0.15959235 0.15935981\n",
      " 0.15912791 0.15889663 0.15866598 0.15843594 0.1582065  0.15797765\n",
      " 0.1577494  0.15752172 0.15729461 0.15706807 0.15684209 0.15661666\n",
      " 0.15639178 0.15616743 0.15594361 0.15572032 0.15549754 0.15527528\n",
      " 0.15505353 0.15483228 0.15461152 0.15439125 0.15417147 0.15395216\n",
      " 0.15373334 0.15351498 0.15329708 0.15307965 0.15286266 0.15264613\n",
      " 0.15243005 0.15221441 0.15199921 0.15178443 0.15157009 0.15135618\n",
      " 0.15114268 0.15092961 0.15071694 0.15050469 0.15029285 0.15008141\n",
      " 0.14987037 0.14965972 0.14944947 0.14923961 0.14903014 0.14882106\n",
      " 0.14861235 0.14840402 0.14819607 0.1479885  0.14778129 0.14757445\n",
      " 0.14736798 0.14716186 0.14695611 0.14675072 0.14654568 0.146341\n",
      " 0.14613666 0.14593268 0.14572904 0.14552575 0.1453228  0.14512019\n",
      " 0.14491791 0.14471598 0.14451437 0.14431311 0.14411217 0.14391156\n",
      " 0.14371128 0.14351132 0.14331169 0.14311237 0.14291338 0.14271471\n",
      " 0.14251636 0.14231832 0.1421206  0.14192319 0.14172609 0.1415293\n",
      " 0.14133282 0.14113664 0.14094077 0.14074521 0.14054995 0.14035499\n",
      " 0.14016033 0.13996598 0.13977192 0.13957815 0.13938469 0.13919152\n",
      " 0.13899864 0.13880605 0.13861376 0.13842176 0.13823004 0.13803862\n",
      " 0.13784748 0.13765663 0.13746606 0.13727578 0.13708579 0.13689607\n",
      " 0.13670664 0.13651749 0.13632861 0.13614002 0.13595171 0.13576367\n",
      " 0.13557591 0.13538842 0.13520121 0.13501427 0.13482761 0.13464122\n",
      " 0.1344551  0.13426926 0.13408368 0.13389837 0.13371333 0.13352856\n",
      " 0.13334406 0.13315982 0.13297585 0.13279215 0.13260871 0.13242553\n",
      " 0.13224262 0.13205997 0.13187758 0.13169546 0.13151359 0.13133199\n",
      " 0.13115064 0.13096956 0.13078873 0.13060816 0.13042785 0.13024779\n",
      " 0.130068   0.12988845 0.12970916 0.12953013 0.12935135 0.12917283\n",
      " 0.12899455 0.12881653 0.12863876 0.12846125 0.12828398 0.12810697\n",
      " 0.1279302  0.12775368 0.12757742 0.1274014  0.12722563 0.1270501\n",
      " 0.12687483 0.1266998  0.12652501 0.12635047 0.12617618 0.12600213\n",
      " 0.12582833 0.12565477 0.12548145 0.12530838 0.12513555 0.12496296\n",
      " 0.12479061 0.1246185  0.12444664 0.12427501 0.12410363 0.12393248\n",
      " 0.12376157 0.1235909  0.12342047 0.12325028 0.12308033 0.12291061\n",
      " 0.12274113 0.12257188 0.12240288 0.1222341  0.12206556 0.12189726\n",
      " 0.12172919 0.12156136 0.12139375 0.12122639 0.12105925 0.12089235\n",
      " 0.12072568 0.12055924 0.12039303 0.12022705 0.1200613  0.11989579\n",
      " 0.1197305  0.11956544 0.11940062 0.11923602 0.11907165 0.1189075\n",
      " 0.11874359 0.1185799  0.11841644 0.11825321 0.1180902  0.11792742\n",
      " 0.11776486 0.11760253 0.11744042 0.11727854 0.11711688 0.11695545\n",
      " 0.11679424 0.11663325 0.11647249 0.11631195 0.11615163 0.11599153\n",
      " 0.11583166 0.11567201 0.11551257 0.11535336 0.11519437 0.1150356\n",
      " 0.11487704 0.11471871 0.1145606  0.1144027  0.11424502 0.11408756\n",
      " 0.11393032 0.1137733  0.11361649 0.1134599  0.11330352 0.11314737\n",
      " 0.11299142 0.1128357  0.11268019 0.11252489 0.11236981 0.11221494\n",
      " 0.11206029 0.11190584 0.11175162 0.1115976  0.1114438  0.11129021\n",
      " 0.11113684 0.11098367 0.11083072 0.11067798 0.11052544 0.11037312\n",
      " 0.11022101 0.11006911 0.10991742 0.10976594 0.10961467 0.1094636\n",
      " 0.10931275 0.1091621  0.10901166 0.10886143 0.10871141 0.10856159\n",
      " 0.10841198 0.10826257 0.10811338 0.10796439 0.1078156  0.10766702\n",
      " 0.10751864 0.10737047 0.1072225  0.10707474 0.10692718 0.10677983\n",
      " 0.10663267 0.10648572 0.10633898 0.10619243 0.10604609 0.10589995\n",
      " 0.10575401 0.10560828 0.10546274 0.1053174  0.10517227 0.10502733\n",
      " 0.1048826  0.10473806 0.10459373 0.10444959 0.10430565 0.10416191\n",
      " 0.10401837 0.10387503 0.10373188 0.10358893 0.10344618 0.10330362\n",
      " 0.10316127 0.1030191  0.10287714 0.10273537 0.10259379 0.10245241\n",
      " 0.10231123 0.10217024 0.10202944 0.10188884 0.10174843 0.10160822\n",
      " 0.1014682  0.10132837 0.10118874 0.10104929 0.10091004 0.10077099\n",
      " 0.10063212 0.10049344 0.10035496 0.10021667 0.10007856 0.09994065\n",
      " 0.09980293 0.0996654  0.09952805 0.0993909  0.09925394 0.09911716\n",
      " 0.09898057 0.09884418 0.09870797 0.09857194 0.09843611 0.09830046\n",
      " 0.098165   0.09802972 0.09789464 0.09775973 0.09762502 0.09749049\n",
      " 0.09735614 0.09722198 0.09708801 0.09695422 0.09682061 0.09668719\n",
      " 0.09655395 0.0964209  0.09628803 0.09615534 0.09602284 0.09589051\n",
      " 0.09575838 0.09562642 0.09549464 0.09536305 0.09523164 0.0951004\n",
      " 0.09496935 0.09483848 0.09470779 0.09457728 0.09444695 0.0943168\n",
      " 0.09418683 0.09405704 0.09392743 0.09379799 0.09366874 0.09353966\n",
      " 0.09341076 0.09328204 0.0931535  0.09302513 0.09289694 0.09276892\n",
      " 0.09264109 0.09251342 0.09238594 0.09225863 0.0921315  0.09200454\n",
      " 0.09187775 0.09175114 0.09162471 0.09149845 0.09137236 0.09124645\n",
      " 0.09112071 0.09099514 0.09086975 0.09074453 0.09061948 0.09049461\n",
      " 0.0903699  0.09024537 0.09012101 0.08999682 0.08987281 0.08974896\n",
      " 0.08962528 0.08950178 0.08937844 0.08925528 0.08913228 0.08900946\n",
      " 0.0888868  0.08876431 0.08864199 0.08851984 0.08839786 0.08827605\n",
      " 0.0881544  0.08803292 0.08791161 0.08779047 0.08766949 0.08754868\n",
      " 0.08742804 0.08730756 0.08718725 0.08706711 0.08694713 0.08682731\n",
      " 0.08670766 0.08658818 0.08646886 0.0863497  0.08623071 0.08611188\n",
      " 0.08599322 0.08587472 0.08575638 0.08563821 0.0855202  0.08540235\n",
      " 0.08528466 0.08516714 0.08504978 0.08493258 0.08481554 0.08469866\n",
      " 0.08458195 0.08446539 0.084349   0.08423276 0.08411669 0.08400078\n",
      " 0.08388502 0.08376943 0.08365399 0.08353871 0.0834236  0.08330864\n",
      " 0.08319384 0.08307919 0.08296471 0.08285038 0.08273621 0.0826222\n",
      " 0.08250835 0.08239465 0.08228111 0.08216772 0.0820545  0.08194142\n",
      " 0.08182851 0.08171575 0.08160314 0.08149069 0.0813784  0.08126625\n",
      " 0.08115427 0.08104244 0.08093076 0.08081924 0.08070786 0.08059665\n",
      " 0.08048558 0.08037467 0.08026392 0.08015331 0.08004286 0.07993256\n",
      " 0.07982241 0.07971241 0.07960257 0.07949288 0.07938333 0.07927394\n",
      " 0.0791647  0.07905561 0.07894667 0.07883788 0.07872924 0.07862075\n",
      " 0.07851241 0.07840422 0.07829618 0.07818829 0.07808054 0.07797294\n",
      " 0.0778655  0.0777582  0.07765105 0.07754404 0.07743718 0.07733047\n",
      " 0.07722391 0.0771175  0.07701123 0.0769051  0.07679913 0.0766933\n",
      " 0.07658761 0.07648207 0.07637668 0.07627143 0.07616633 0.07606137\n",
      " 0.07595656 0.07585189 0.07574736 0.07564298 0.07553875 0.07543465\n",
      " 0.0753307  0.0752269  0.07512323 0.07501971 0.07491633 0.0748131\n",
      " 0.07471    0.07460705 0.07450424 0.07440157 0.07429905 0.07419666\n",
      " 0.07409442 0.07399232 0.07389035 0.07378853 0.07368685 0.07358531\n",
      " 0.07348391 0.07338264 0.07328152 0.07318054 0.0730797  0.07297899\n",
      " 0.07287842 0.072778   0.07267771 0.07257756 0.07247754 0.07237767\n",
      " 0.07227793 0.07217833 0.07207887 0.07197954 0.07188035 0.0717813\n",
      " 0.07168239 0.07158361 0.07148496 0.07138646 0.07128808 0.07118985\n",
      " 0.07109175 0.07099378 0.07089595 0.07079826 0.0707007  0.07060327\n",
      " 0.07050598 0.07040882 0.07031179 0.0702149  0.07011815 0.07002152\n",
      " 0.06992503 0.06982867 0.06973245 0.06963636 0.0695404  0.06944457\n",
      " 0.06934887 0.06925331 0.06915788 0.06906258 0.06896741 0.06887237\n",
      " 0.06877746 0.06868269 0.06858804 0.06849353 0.06839914 0.06830489\n",
      " 0.06821076 0.06811676 0.0680229  0.06792916 0.06783555 0.06774208\n",
      " 0.06764873 0.06755551 0.06746241 0.06736945 0.06727661 0.06718391\n",
      " 0.06709132 0.06699887 0.06690655 0.06681435 0.06672228 0.06663033\n",
      " 0.06653852 0.06644682 0.06635526 0.06626382 0.06617251 0.06608132\n",
      " 0.06599026 0.06589933 0.06580852 0.06571783 0.06562727 0.06553683\n",
      " 0.06544652 0.06535634 0.06526628 0.06517634 0.06508652 0.06499683\n",
      " 0.06490727 0.06481782 0.0647285  0.06463931 0.06455023 0.06446128\n",
      " 0.06437245 0.06428375 0.06419516 0.0641067  0.06401836 0.06393014\n",
      " 0.06384205 0.06375407 0.06366622 0.06357849 0.06349087 0.06340338\n",
      " 0.06331601 0.06322876 0.06314163 0.06305462 0.06296773 0.06288096\n",
      " 0.06279431 0.06270778 0.06262137 0.06253507 0.0624489  0.06236284\n",
      " 0.06227691 0.06219109 0.06210539 0.0620198  0.06193434 0.06184899\n",
      " 0.06176377 0.06167865 0.06159366 0.06150878 0.06142402 0.06133938\n",
      " 0.06125485 0.06117044 0.06108615 0.06100197]\n"
     ]
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "最后，我们可以使用我们拟合的参数计算训练模型的代价函数（误差）。"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练后的代价值: 0.06100197196403416\n"
     ]
    }
   ],
   "source": [
    "const = compute_cost(X, y, g)\n",
    "print('训练后的代价值:', const)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "现在我们来绘制线性模型以及数据，直观地看出它的拟合。"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 864x576 with 1 Axes>",
      "image/png": "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NqFDhw4AfP311/zmN78BYMkll+TJJ59k1VVXJcZIVVUVCy20EDHGWc7VpUsXrq0TtisrKxk9ejSjR49mwoQJOfucJEmS1LDCWwFuYqV2Qant3QXo3bs37777Lp999hljx45l5ZVXnhlyn3jiCUaOHMlCCy3ElClTWHLJJWeG4Vprr702U6dOnfnxV199xe233w6kQL3jjjvm6LOSJElSQwovAOdZSUkJiy22GL///e955ZVXWGSRRdh8882pqanh+uuv59FHH+W9995jwIABfP755xx77LHU1NTw2muvNXi+3/zmN/To0QOAt956K4efiSRJkhpiC0RGjHHmSm+XLl348ccf2X777Tn88MPZfvvtuf3229liiy1YcsklOf/887nwwgtZdNFF+de//kXnzp355JNPKCkpmXmumpoaqqurWXrppdlqq63Yaqut6NSpEwDV1dV5+zwlSZKKnSvAwPTp09liiy04+OCDmTFjBieeeCIxRm6++WYqKys54IADuPDCCznggAOYMGECF1xwASuuuCLnnnsuX331Fd988w0bbrghm2yyCQDTpk3j22+/Zdddd6V9+/ZceOGFM5/r7bffZsaMGRx00EF5+mwlSZJypLISvvsOOnbMdyWzCPUv4lrQunbtGocOHTrLbR9//DFrrbVWTutoSkVFBR3rvFBTp05lkUUWmbnCm2+F9vWSJEmaRYzw+ONw+umwyirw0ksQQk5LCCG8E2Ps2tB9tkA0oGO9n1IWW2yxggm/kiRJBW34cNhhB9h3X1hiCfjHP3IefuckawE4hHBzCGGPbJ1PkiRJLcj338NJJ6X9F8rL4YYb0tvttst3ZbPJSg9wCGFr4LcxxiezcT5JkiS1ENXVcPvt0KtX6vf9v/+Diy+GzF4KhWi+V4BDCKXAbcCYEMJe819SyzJt2rR8lyBJkpQfr74KXbvC8cfD2mvDu+/CzTcXdPiF7LRAHAF8BFwBbBJC+Hv9A0IIx4UQhoYQhk6cODELT5l9N910Ez///HOTx3zzzTf07Nlz5seTJk2aOeO3rvPPP59BgwZx3nnn0adPH3788Ue6d+8+2/izGTNmsM8++wBwyCGH0K1bt5l/dt999/n/pCRJkhaEsWPhoINgm21g0iR46CEYNAj++Md8V9Ys2QjAGwD9YoxfA/cB29Y/IMbYL8bYNcbYtX379ll4yuxbc8012Wuvvfj555+54YYbGDRoEM8//zxTpkzh+OOP5+uvv+auu+5i00035d133+Xggw/mgAMOYNKkSRx55JEccsghjBw5kp9++omlllqKN954gwkTJjB69GjGjBnD4osvTklJCTU1NdTU1BBjZKGFFmL69OkAVFVVMWjQoJl/Fl100Tx/RSRJkuqprIRLLoHOneGJJ+D88+GTT+CAAwruQremZKMHeDSwWub9rsAXWThnk8rKK+g7cATjJ1fSoV1benbvTI8N5m++3Pbbb89SSy3FIossMnMTiyeeeIJOnTqx0EILMWPGDMrLyznxxBPZa6+9eOGFF9hvv/144oknWGKJJWaep6KigkmTJnHjjTey/vrrs8UWW3DTTTcxevRottlmG0aPHk1ZWRljx46lX79+vPfee+y3336MHTuWbt26UV1dTQiBcePGze+XSZIkKTtihAED4IwzYMwY2G8/6Ns3jThrgbKxAnwHsG0I4RXgBODKLJyzUWXlFZwzYBgVkyuJQMXkSs4ZMIyy8op5Pme/fv3YY489eOONN1hooV9/Jgh1fpLp378/kyZNYp999mHvvfdm6623ZtiwYWy55ZY8++yzM48rKSlhzJgxnH766XTs2JGvv/6aIUOGcNlll3HrrbdywAEHsMkmm7DvvvsycOBANt54Y0444QRWXXVVBg0axAknnMBf//pXPvvss3n+fCRJkrJm2DDYfvsUepdYAl58ER55pMWGX8jCCnCM8Udg/yzU0ix9B46gsmrWXtrKqmr6Dhwxz6vAxx13HGuvvTbPP/98Ol9l5SxBGOCoo45it9124/LLL+fEE09k/Pjx7LXXXrz55puUlpYyY8aMmSvFF1xwAffeey+nn346paWlnHvuubzzzjssvPDCrLbaajPPOWjQIF599VX23ntvPvnkE3bYYQcmTJgAwK233sohhxzCcccdN0+fkyRJ0nz57rvU4nDLLbD00nDjjWnCw0ItfyPhFvcZjJ9cOVe3z402bdKC+Geffca+++47y30hBK688kpOO+00hg8fzvDhw3n//fcZM2YMSy65JEsuuSSPP/44X3zxBb169WLUqFG8//77vPfee3z++eczL3bbZZddALjnnnt47LHH2HrrrTnmmGN4+eWXue+++3j00UcB2G+//eb785EkSZpr1dXQr18aazZ5cprwcPHFsNxy+a4sa1pcAO7Qri0VDYTdDu3azve5f/jhB1588UVGjRrFGmusMct9I0aMYMSIEdxzzz1sv/323HHHHTzxxBP89NNPLL300pSWlrLEEkuw5ZZbcsABBzB48GB22WUXunTpQmlpKRtuuCFPPPEE559/PgD7778/hx9+OHvssQdffvkl7du3Z/XVV2ellVYC4OSTT6aiYt7bOiRJkuba//6XNrP44APo1g2uuw7WWy/fVWVdi9sKuWf3zrQtnXVb4ralJfTs3nm+zjtt2jTuuusuhg4dytprrw2kyQwAMUZWWmklLr/8cpZYYgkGDhzIUUcdxVprrUVNTQ0dO3bk7rvvZtiwYQAcf/zxbL/99lx66aUMHz6czz//nA8//JCFF16Yd999N9Xcti0hBEIIvPbaa2y33XZsvPHGM6dAbL311vP1+UiSJDXbl1/CgQem0Dt5Mjz8MLz0UqsMv9ACV4Br+3yzPQXi22+/pU+fPpSXl3PBBRcAcO21186cCvHaa6/x/vvvc9RRR/H222+zxx578N1333H33XczYMAArrnmGj7++GNWXHFF/vrXv7LaaqsxePBgPvroI4466iiuvPJKVlhhBfbbbz/uv/9+Vl99dc466yx22mknXn/9da699lpOPvlkunXrBqQVZ0mSpAWqshKuuAL++c/08YUXQs+esNhieS1rQQsxxpw+YdeuXePQoUNnue3jjz9mrbXWymkd2TB16lTatGkz28ze2gviIK0e19TUUFJSMvPj0MicvKqqKkpLS+f4vC316yVJkgpEjPDYY2ms2RdfpDm+ffvCyivnu7KsCSG8E2Ps2tB9LW4FuJAs1shPR/VHqdWG39qPG9Oc8CtJkjRfPvgATj457dy23nrp7Z/+lO+qcqpgeoBzvRLdUvl1kiRJ82TSJPjb32CDDVIIvuUWePfdogu/UCABeNFFF2XSpEmGuzmIMTJp0iS3SZYkSc03YwbcfDN06gS33gonnACjRqXxZiUlc358K1QQLRArrrgi48aNY+LEifkupeAtuuiirLjiivkuQ5IktQSDBqWxZsOGwXbbpbFm66yT76ryriACcGlpKauuumq+y5AkSWodvvgiXeD26KPw+9+nt/vsA01ci1RMCiIAS5IkKQumTk0jza64IoXdiy9OQbjt/G8Y1poYgCVJklq6GOGRR1LYHTsWDjooheDMDrOaVUFc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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(data['X'].min(), data['Y'].max(), 100)\n",
    "f = g[0, 0] + (g[0, 1] * x)\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(12, 8))\n",
    "ax.plot(x, f, 'r', label='预测值')\n",
    "ax.scatter(data['X'], data['Y'], label='训练数据')\n",
    "ax.legend(loc=2)\n",
    "ax.set_xlabel('X', fontsize=18)\n",
    "ax.set_ylabel('Y', rotation=0, fontsize=18)\n",
    "ax.set_title('预测收益和人口规模', fontsize=18)\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "由于梯度方程式函数也在每个训练迭代中输出一个代价的向量，所以我们也可以绘制。 请注意，代价总是降低 - 这是凸优化问题的一个例子。"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 864x576 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(12, 8))\n",
    "ax.plot(np.arange(iters), cost, 'r')\n",
    "ax.set_xlabel('迭代次数', fontsize=18)\n",
    "ax.set_ylabel('代价', rotation=0, fontsize=18)\n",
    "ax.set_title('误差和训练Epoch数', fontsize=18)\n",
    "plt.show()\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 使用scikit-learn的线性回归函数"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0. 3.]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "model = LinearRegression()\n",
    "model.fit(X, y)\n",
    "print(model.coef_)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 864x576 with 1 Axes>",
      "image/png": "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BgAgtXhLyjRw0hz1GP+azr3uSanOlrK5178aCMlS4uyLvKsIyilgyJAh+uSTT/Taa6/p888/1xlnnKGxY8cqOztbXq9X2dnZkqRp06bpgw8+CBw4Ikk33XST9tprL40ePVqLFi3Sr371K+3cuVNDhw7VlClTdnkto0eP1ubNm0O+Pvroo6j9XAEAQHzV9iGXlVdo+eQz9OydYwLXPrnqBvWaOCskOCf6DXsNISgnmaqqqojjZWVlGjt2rM4++2wdeOCBWrhwoQYMGKDSUt8hiGvXrtW1116r4447TgMGDJDk622eNm2abrrpJvXs2VMvvPCC3nvvPd16660hrx18EEmwmpoa1dTUaNmyZVqyZIm2bNmirVu36ptvvgn5WrNmjSRfC8aiRYsC28UBAIDkE3xwSLCBBbP103v/roIRfZLqhr2G0KOcJBYvXqx7771X77//vvbff/+Qa3PmzNEFF1ygLl26aMqUKdp7771VXFysUaNGaeDAgXr99deVk5OjQw89VJdeeqkkXy/zyJEj1b9//8DYscceq8suu0xz5szRTTfdpFmzZunyyy/XqlWr1L1797A1bd++XZmZmZo4caJmzZql1q1bq1WrVho0aFDY3L333lsjR45UZWWlFixYEGgVAQAAia12u7faA0HqHhzyx+E3qCjvOJm/DznZbthrCEE5SeTm5uq5555T9+7ddccddwTGx44dq//7v//TOeeco0ceeSSwP3K7du30wgsv6KyzztLvf/97LVq0SLNnzw7sdNGjRw/99a9/1ciRI9W69Y+/DAoKCpSZmamMjAwdf/zxGjJkiIYMGaLf/OY3YWuqDcovvvhiC//sAQBAPEz0LtbU+avkJF3+7rPKn/tUyPXccTMCj5O1D7khVhucEk3//v3dggULGpyzdOlS9erVK0YrSkzl5eWaN29evfsab9u2TevXr49YEU4H/BoBAGD3eEvKdO2zH8pJYW0WF466Vf/rcWTguSczI2lbLMxsoXOuf6RrVJSTXFZWVr0hWfIdS52uIRkAAOy+wqJSLa8TkKUfq8g5WZ5AO0b+0LykDMmNISgDAAAgVHV1WC/y6WPu0ZJ9fWc15GR5VDx+cDxWFlMEZQAAAPyozp7IUmgvsklJu93briIoAwAAQNqwQdprr5Chk656Uis8P46ZpNEDuqdkm0UkBGUAAIA009iWb5Ik53RNnXmp2otcH4IyAABAGqk9Wa+iqlo9163Um5MvD51QUSG1aycptfZE3h0EZQAAgDRSWFSqiqrqsC3fJEkJum1wvBCUAQAA0shx/3tFhbPuDRnLvf5VmZmWx2lNiapVvBeApluyZIk2btzY7NfZvn17vdfKy8t13333aevWrQ2+xrp16yT5DjS54oor9PHHH0uSVqxYEZgzZcoULVu2rNH1rFixQrNnz27CygEAQLOYhYTkGplvRwuzlDxZr7kIyknksssu0wknnKDVq1eHjH///ff1fs+nn36qlStXhozdfvvtOuGEE7Rt27aw+W+//bauuuoqLVmypN7XXLt2rfLy8jR9+nRVVVXp/vvvV1lZmT799FMdcsgh+uqrr7R9+3ZddtlleuaZZxr9eb3yyis6//zzA88rKytVXl7e4Fd1dXWjrwsAAPwuvjhs27fccTN00LhXJflO1kuXLd92BUE5ibz44otq1aqVjj/+eJWVlQXGhw0bpiuuuEKSL8S+++67gWt//vOf9a9//Svw3DmnqVOnqkePHmrfvr2qq6tVUVGhmpoaSdJLL72kwYMH6+ijj5Yk1dTUqLKyUpWVlYHX2GeffXTXXXfp0ksvDVSn27Ztq0mTJmnEiBE66KCDtGTJElVXV2vkyJGN/rw8Ho/atm0beD558mRlZ2c3+NWUSjUAAOnIW1KmgZPmqMf41zRw0hxfQH700R8nDB8u76JvlJPlkcl3eEiyHj/d0uhRTiKdO3fWm2++qUGDBum6664LVGs9Ho86dOggSfrvf/+rCy64IBBs27RpozZt2gRe4/XXX9fatWs1efJk1dTUaO7cufr5z38e9l5W52+df/zjHwOBe+7cuZKk/Px8vfnmm5J8leju3burdevWevvtt7Vo0SLl5uaqV69egdeoqalRVVVVSCiO9F5t27bViSeeqLfffjtsXeXl5crOzlY7/924AADgR8E7Wnzwz/PVZWt56AT/zXrDJYJxExCUk0znzp31xhtvqFOnToGxtm3bKiMjQ5LCAqSZhQTRu+++W9dff7323XdfPfPMM/rHP/6hkpIS7bfffpo5c6auvPJKLVmyJBC8nXOqqqpSZmZm4DX++9//avr06crMzNQHH3wgyVeJ7tixo6qqqrRz5059+OGHWrFiRVgIPvfcczVt2jRJvhaQ1q1ba+HChdq0aZPuuuuuQMDfuXOnysvLw37+tT3ajrtyAQAIU9+OFveccZmuefX+OK0qeRGUk8CWLVs0a9YstW/fXhkZGerWrZu6d+8euN66detAcKwbTIO9/fbbKi0tldfrlSTde++98ng8Ovjgg9W+fXvNmDFD5513ng488MAG1zNx4kRNnDhRt912m7766iutX79eN9xwg2pqajR69Ght3LhRXbt21aOPPhqoVp988skaNWqULr300sDrfPHFF8rIyNDatWu1c+dOLVu2TJWVlerZs6eKi4uVnZ1d7xqCW0EAAIBPpINDcsfNkEm6JuarSX4E5XrUPbEmnifRrF27VhdddJE8Ho/Ky8t17rnn6qmnngpcr6qqCvQYN/Qav/vd7zRw4EA9/fTT+vzzz7VgwQLNnDlTe+65Z8jcRx55RJK0fPly5ebmhr2Wc0633HKLJk2aJK/Xq2HDhmnJkiUqLCxUVlaW1q1bp+3btysnJyfw/T/88IN69uypAw44IPA6j/r7pR5++GEtX75cDz74oCTpnnvuCWm9WLNmjQ499FDNnTtXffr02aX/dgAApIUdO6Q6rY0XjLpVc3scKUnsaLGbCMoRBPf3SFJZeYUmTF8sKT79PAcddJA2b94sSTrppJNC2iAkX3W1tvWiPu3atdO6detUXFysNWvW6O2339Yll1yiIUOG6Ntvv9Xzzz+vO++8U4sXL9Ynn3yi4447Tu3btw97ncrKSv3yl7/UO++8o5deekmDBg2SJA0YMEA33nij7rnnHm3atEmSbzu7U089Vdu3b9eGDRtCQnIkc+bM0c0336yzzjorcBOhJLVq1SrQclFZWSnnnCorK9WxY0e1bs0vYQBAevGWlOnmV5aovKJKkiIeHJI7bkbgMTta7D52vYigtr8nWEVVtQqLSuO0olB1g/LWrVvl8TT8N8U999xTX3/9tVauXKmLLrpIWVlZuuWWW5SRkaF9991XTzzxhC666CJ17Ngx8FqtWoX/8mjXrp3GjRunefPmadiwYbr77rt11VVX6ZhjjtHEiRN1xRVX6P3339fxxx+v9957T5IC29kdfPDBEddWVlamr7/+WqNGjdLo0aNVWVmpuXPnyuPxyOPxqGvXrpKkww8/XB6PR+3bt9dee+2lTz75ZNf+wwEAkOS8JWXKf/4jlVdUad9N68ND8sqV7GgRRZTjIlhdXrFL47FWtw/5iy++0D777NPo92VnZ2vTpk0aP3687rjjDnXp0kWS9OCDD2rRokUqLCzUZ599Fjg05IsvvtB3332nHTt2KDc3N9Az3LVrV1VVVemTTz7RHXfcoTFjxuj777/X999/L+ecJkyYoN69eys/P1/OOX300UfKzs4OaeOoqqrSiy++qHvvvVfz589Xly5dtHTpUu2999667rrrdPbZZ+uBBx6Q5DvU5OCDD9a8efOUm5sbqCjvt99+UfivCQBA8igsKlVVjYtYRR5YMFvF3btreHd2tIgWgnIE3bI8KosQihOxv+frr7/W5s2bddhhhzVp/tVXX628vDxdfPHFkqTq6mp9+umnatWqlX71q1+pVatWgcM8Tj/99MA+y88995x++ctfSpLGjBmjzz//XDt37tSOHTs0bdo0TZs2TVu3blWnTp20evVq/fDDDxozZozmz5+v4uJiDRgwICTgO+f0l7/8RUcffbTOOussPfTQQ9p7770l+Q5QOeCAA7TvvvtK8t3MKPl2/KgdAwAgndTeO3X4/DdV/PKkkGs/+fNL2tE6U5YgBb1UQutFBPlD8+TJDO35TbT+nnnz5mnbtm16//331bZtWx111FGNfs/NN9+sxx9/XPvuu6/OOussHXLIIRo1apRuu+02bdy4Ud9//73Wr1+vt956S5JUWlqqDRs2aPv27YGQLEkLFizQpk2b1K9fP1177bVav3691q9fr969e+vcc89Vq1at1LlzZw0bNkz/+Mc/9Pzzz+vUU08NWUubNm00b948TZ06NVDZrlVaWqoDDzxQhxxyiDIyMpSVlaWMjAwdeuihat26tcxM//vf/6LwXxEAgMRXe+9U8YQherBOSM4dN0M7WvtaMhOxoJfsCMoRDO+Xo4IRfRK2v2f9+vUaMWKEHnvsMT377LMaPHhw4Ma7ho52btOmjbp166bt27dr0KBB+sc//qF77rlHnTp10po1a3Tsscdq+fLlgfmbN2/Wz372M73++uthr/Xqq6/q3XffVVVVlf773/9q2rRpWrJkia6//vrAnKuvvlrTpk3T2rVrdeGFF4a9RufOncPGtm/frkWLFqlv377q0KGDHnnkEe3cuTPkSwrfLxoAgFRTe8Lett9drKW3DQu5ljtuRsgNe5kZllAFvVRB60U9hvfLSZhgHGzbtm168cUXNWjQIJ144om6+uqr9eKLLwau79ixI2S+cy6wx/KECRN0ww03BMYXLlyoN954Q+eff75GjhyprVu3ao899gjsMNGxY0f17NlTF154oT7++OOQtodBgwbpueee05w5c3ThhRdq1apVysnJ0TvvvKNzzjlHGRkZ6tq1qzIyMtS5c+cGA3ywBQsWyDmnn/3sZw3uCR3pRkMAAFJFbRW5bkCWQne0kKTs9pm66czeCZlbkh1BOYls3LhRS5cu1T777KOnn35a559/vnr16qUzzzwzMCcvL08TJ04MPN++fbu2b98uybcv8ty5c/X222+rqKhIP/zwg84991wVFRVp7dq1euedd9SlSxetWrUq8P0PPPCA+vTpo4suukgzZ84MjGdnZ2vkyJHKzs7Wyy+/rPPOO0+5ubm66qqrdNhhh+nLL7/URRddpNGjR+utt97SiSeeqDfffFM5OeG/iXfs2BEIxf/+97914oknqmPHjpJ8fzGIdEIfAACpbPiR+2t4nbG6ATkny6Pi8YNjtqZ0RFkuiWzfvl3777+/nnrqKW3fvl07duzQAw88EFJdPfzww0OCcmVlpbZv365t27apT58+uvjii7Vhwwbdf//9+uGHH2RmmjNnjt544w3tueeeeuaZZ/TQQw+pVatW6tSpk7KzszV58mS9/vrrev/99yX5tnN7+OGHdfzxx2vkyJG64YYb9PTTT6ugoECvv/66brrpJp1zzjn605/+pCeeeEKzZs3S999/r8MPPzxwmInk2zbuhhtu0P33368uXbqotLRUjz32WKBNo7q6Wpdffrmys7NDviQFWjAAAEg5df5FdW2H7LCQnGj3TqUqKspJZJ999tGiRYsC+xzPmzev0e+ZNm2a2rRpo/bt2+vxxx/XcccdF1LV/cMf/qDLL79chx12mKqrq5Wfn68dO3bolltuCezX/Jvf/Ea9e/dW3759JUlvvfWWJk2apIsvvlgzZsxQp06dAq/3+uuva+3atXrvvfcCNxj27t1bixYt0sUXXxyyO0eXLl00bdo09e7dWxMmTFBWVpauu+46jRo1SpIv5D/22GP67W9/G/JzMjOOsAYAJL26pwDXd/x0XTlxPjE4nVht/2qi6d+/v1uwYEGDc5YuXapevXrFaEXpYdOmTWFHWsfLpk2b1K5dO7Vp02a3X4NfIwCARBRyCrBzWnHHmSHXVww/T8N+OibkADRPZkZCbS6QKsxsoXOu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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.array(X[:, 1].A1)\n",
    "f = model.predict(X).flatten()\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(12, 8))\n",
    "ax.plot(x, f, 'r', label='预测值')\n",
    "ax.scatter(data['X'], data['Y'], label='训练数据')\n",
    "ax.legend(loc=2, fontsize=18)\n",
    "ax.set_xlabel('X', fontsize=18)\n",
    "ax.set_ylabel('X', rotation=0, fontsize=18)\n",
    "ax.set_title('预测曲线', fontsize=18)\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## $L_2$正则化\n",
    "$J (  { w } ) = \\frac { 1 } { 2 } \\sum _ { i = 1 } ^ { m } ( h _ { w} ( x ^ { ( i ) } ) - y ^ { ( i ) } ) ^ { 2 } + \\lambda \\sum _ { j = 1 } ^ { n } w_ { j } ^ { 2 }$，此时称作`Ridge Regression`："
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.         2.69110631]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import Ridge\n",
    "model = Ridge()\n",
    "model.fit(X, y)\n",
    "print('模型参数', model.coef_)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 864x576 with 1 Axes>",
      "image/png": "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deskSdddd53efffdkPNu3rxZ9957r7Zv3x4YC7eK7Pff//5XS5cu1V577SVJatu2rU455RS53W6lpaVp3rx5mjFjhtLS0pSWlia3262lS5fK7XaHPWebNm104oknas2aNaqsrGzSnxEAAEhMTmUWVlLdtOFxu5SXmx23edUnGjfzbZJ0cp3h8XWO2WKMGVJz3N3W2s3NvW69rrlG+vLLmF6i0Y44Qrrvvia/fPv27frFL36hDz74QNddd11Qtwn/TXzWWm3evFnLly9Xdna2Fi5cqOOPP14ej0eVlZVauXKlhg8frn/961+65pprQl7fuXPniOayatUqjR07NhDU/dq2basLL7wwqJRDkpYtW6ZevXrVu0Jd+9ydO3cOCdT11Sjv3LlTN9xwg5599llVV1dr9OjRjsf961//0v3336+tW7dq5MiR6tGjh+677z7dfPPNgT+PWbNm6aabbtKXX36prKwsXX755bruuuuC6sIBAEDjhSunsJKy0j2Bcoy83OyEqE+WolSjHImaQD21wQMRYteuXYGb8/weeeQRSVJmZqaeeeaZwPj8+fP161//WkuWLAmMud1uud1uTZ06Vddff73uu+8+XXrppSHX6dChQ4Nzqaqq0iWXXKKMjAwde+yxQc+5XC7t2rUrqOxDknbs2BF4vq5t27Zp/fr1qqio0PTp0zV16lSNGjWqwXnU9pe//EVPPvmkRo8erd69e+vBBx/Uzz//rKOOOipwzNSpU5WXl6frr79e3bt31913362MjAz9+9//Vu/evSVJH3zwgXJzc3XWWWfpsssu0+LFizV27Fjt2LFDt956a6PmBAAAgoWrSc5K92ju2KEtMKOGxS0ox1UzVm4TUVpamn788Ud5PB69/fbbGjNmjH744QddccUVqqoK/hFGeXm52rRpo4MPPjhQclHb3Xffrb/97W/ac889A2P+kotIVnxLS0vl9Xr173//W//5z39Cnp88ebImT54c8e/t2muv1bXXXht4fOqpp+q+Rrx/P//8s55++mn98Y9/1KOPPipJOv3005WdHfwjmzlz5ujII48M3EhYXV2t66+/XhdccEHgmHHjxmnw4MF6+OGHJUkjRozQDz/8oEceeYSgDABAhOresOdfIc7LzQ6qUZYSq8zCCT9PThL77bef9t57b3Xo0EHGGKWnp2v9+vVBLdYkXzu4Ll26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xZ3KPFvpvUO0h3PQojvWRKBuHfKyZcu0zz77NPi6jIwMbdmyRWPHjtXdd9+trl27SpIeeeQRffHFFzr++OO1ZMmSwKYhy5Yt0+LFi1VUVKRNmzYFztOtWzdVV1frq6++0t13362qqipt2LBB3377ray1GjdunEaPHq2PPvpI1lotWrRIGRkZQWUclZWVmjJlio477jjdeuut2nvvvVVSUqLRo0ertLRUZ511llavXq3Vq1fru+++kyTNmzdPq1ev1qpVq/T999/r0EMPbeafJAAAySW/sCQoJPtVVtnAFtQj+mdp7tihWj7pNM0dOzR6IXn8+NCQ/NNPrTYkS6woO4p7fU8z/Pjjj9q6dasOO+ywiI6/+uqrlZ2drcsuu0ySVFVVpa+//lpt2rTR2WefrTZt2gQ28zjttNMCfZanTp2qM888U5J0ySWX6Ntvv9WuXbu0c+dOTZkyRVOmTNH27dvVuXNnrVq1Shs3btQll1yi+fPna+7cuRowYEBQwLfW6uabb9YxxxyjM844Q//5z3+09957S/JtoLL//vtr3333leS7mVHydfzwjwEAkEr890455RO/mC3o/fCDVPeepUsvlWruaWrNWFF2EPcda5pg3rx52rFjhz777DO1a9dORx11VIOvufXWW/X0009r33331RlnnKGDDz5Y5513niZMmKDNmzdrw4YNWr9+vT744ANJUklJiTZt2qSKiopASJakBQsWaMuWLerfv7+uvfZarV+/XuvXr1efPn10/vnnq02bNurSpYuGDx+uBx54QC+//LJOOeWUoLm0bdtW8+bN0+TJkwMr234lJSU64IADdPDBB8vlcik9PV0ul0uHHnqo0tLSZIzRRx99FIU/RQAAEp//3qn6QrIUowU9Y0JDsrUpEZIlgrKjuO1Y00Tr16/XyJEj9dRTT+mll17S0KFDAzfe1be1c9u2bZWZmamKigoNHjxYDzzwgO677z517txZa9as0XHHHafly5cHjt+6dauOPvpozZgxI+Rcb775pj755BNVVlbqww8/1JQpU7R48WJdf/31gWOuvvpqTZkyRWvXrtXFF18cco4uXbqEjFVUVOiLL77QEUccoY4dO+rJJ5/Url27gj6k0H7RAAC0Nv4d9q556cuQe6fqcrtMdBf0jAkts9i5s1WXWTghKIcRs/qeZtqxY4deffVVHXzwwTrhhBM0bdo0jR49OvD8zp07g4631gZ6LI8bN05er1evvPKKrr/+eu2zzz569913VVFRoXPPPVebNm3SHnvsEXhtp06d1KtXL1188cVas2ZN0HkHDx6sqVOnqqKiQhdffLEuuOAC7b333vr4448DYb1bt25yuVzq0qVLvQG+tgULFshaq6OPPrrentBONxoCANBaRLqKLPm6XuSfc3h0ssrjj4cG5Lvu8gXkOs0EUgE1yklk8+bN+uabb7TPPvvohRde0IUXXqjevXvr9NNPDxyTnZ2t8ePHBx5XVFSooqJCkq8v8pw5czR79mwVFhZq48aNOv/881VYWKi1a9fq448/VteuXbVy5crA6x9++GH17dtXl156qaZPnx4Yz8jI0LnnnquMjAy9/vrr+u1vf6sePXroqquu0mGHHabvvvtOl156qUaNGqUPPvhAJ5xwgmbOnKmsrNAv4p07dwZC8fPPP68TTjhBnTp1kuT7xsBphz4AAFozpw5cdWWlezR37NDoXLCqynlzkBRbQa6LZbkkUlFRof3220/PPfecKioqtHPnTj388MNBq6v9+vULCsrl5eWqqKjQjh071LdvX1122WXatGmTHnroIW3cuFHGGM2aNUvvvvuu9txzT7344ov6z3/+ozZt2qhz587KyMjQXXfdpRkzZuizzz6T5Gvn9sQTT+j444/XueeeqxtvvFEvvPCCJk6cqBkzZuiWW27ROeeco7/97W965pln9M4772jDhg3q169fYDMTydc27sYbb9RDDz2krl27qqSkRE899VSgTKOqqkp//etflZGREfQhKVCCAQBAa9TQjXlRvXfKmNCQbG3Kh2SJFeWkss8+++iLL74I9BeeN29eg6+ZMmWK2rZtqw4dOujpp5/WwIEDg1Z1//SnP+mvf/2rDjvsMFVVVSkvL087d+7UbbfdFujX/Lvf/U59+vQJ9Cz+4IMPNGnSJF122WV666231Llz58D5ZsyYobVr1+rTTz8N3GDYp08fffHFF7rsssuCunN07dpVU6ZMUZ8+fTRu3Dilp6fruuuu03nnnSfJF/Kfeuop/f73vw/6PRlj2MIaAJD06tsFOFwHLsm3khyV3sgdO0o7dgSPff211Lt3887bihiboN8t5OTk2AULFtR7zDfffKPevJlRtWXLlpAtrVvKli1b1L59e7Vt27alpxIR/j4CACJV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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x2 = np.array(X[:, 1].A1)\n",
    "f2 = model.predict(X).flatten()\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(12, 8))\n",
    "ax.plot(x2, f2, 'r', label='预测值Ridge')\n",
    "ax.scatter(data['X'], data['Y'], label='训练数据')\n",
    "ax.legend(loc=2, fontsize=18)\n",
    "ax.set_xlabel('X', fontsize=18)\n",
    "ax.set_ylabel('X', rotation=0, fontsize=18)\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## $L_1$正则化：\n",
    "$J (  {w } ) = \\frac { 1 } { 2 } \\sum _ { i = 1 } ^ { m } ( h _ { w} ( x ^ { ( i ) } ) - y ^ { ( i ) } ) ^ { 2 } + \\lambda \\sum _ { j = 1 } ^ { n } | w _ { j } |$，此时称作`Lasso Regression`"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "模型参数 [0. 0.]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import Lasso\n",
    "model = Lasso()\n",
    "model.fit(X, y)\n",
    "print('模型参数', model.coef_)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 864x576 with 1 Axes>",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsoAAAHjCAYAAAA63TkjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABCYElEQVR4nO3deXyU1dn/8e9hMsCASCJEbKJxAyPygFtURBTEJUWrRaxai0srLf5cUGmNhUorWluseR5FrUutKFZRRMWpWiRiAUUENRhpihJxhQ5SQAgITEKW8/sjmTGT3DOZkMksmc/79cqL5J6TmQMD+uVw3ddlrLUCAAAAEKpLojcAAAAAJCOCMgAAAOCAoAwAAAA4ICgDAAAADgjKAAAAgAOCMgAAAOAgI9EbCKdv3772kEMOSfQ2AAAA0ImtXLlyi7U22+mxpA3KhxxyiEpLSxO9DQAAAHRixpivwj1G6QUAAADggKAMAAAAOCAoAwAAAA4IygAAAIADgjIAAADggKAMAAAAOCAoAwAAAA6Sto9ytLZv364tW7Zoz549id4K0pDL5VKvXr203377qVu3boneDgAAiKGUDspVVVX673//qwMPPFAej0fGmERvCWnEWquamhrt2LFD69atU15eHmEZAIBOJKVLLzZv3qzs7Gz16NGDkIy4M8aoa9eu6tu3r7KysrR169ZEbwkAAMRQSgflqqoq7bPPPoneBqB9991X3377baK3AQAAYiilg3Jtba0yMlK6egSdhNvtVl1dXaK3AQAAYigmQdkYs58x5ixjTN9YPF8bXzveLwm0wO9DAAA6n3YHZWPM9yT9Q9KJkhYbY7LDrJtpjHnHGDO1va8JAAAAdLRYnCgPkjTJWvsHSSWSjmu+wBgzVpLLWjtMUo4xZkAMXhd7we/3t/l7li9frk8//dTxsfr6+vZuCQAAICm1u8DXWvuGJBljTlPDqfIdDstGSprb+PkiScMlrW3va6cTv98vl8ulrl27tnhs1apV6t69u2NrsqqqKrndbh1++OF64YUXdOONN+pvf/ubzjjjDK1evVpff/11i+8ZMmSI9t9//+DXl19+uS666CJNnz69xdqf//zn2rp1q5544gllZWUFr19//fV67bXXtHz58pDnAgAAaMpb5lNxSYU2VPqVk+lRUWG+xhybm+htSYpRH2XTUKB5iaQaSU53NPWU5Gv8fIek/mGeZ4KkCZKUl5cXi611GhdccIFKSkpkjFGXLt/9Q8A///lPFRYWKiMjQ927d9f27dvlcrmC3UD8fr+GDx+ukpISnXbaacrPz9fZZ5+tmTNn6p133tGcOXNCguxnn32mV199Veeee27wWrdu3RwDelVVlV588UWdeeaZqqys1JYtW5SRkSFjjDZu3KjKykrt3r1bX375pSSppqZG++yzj773ve9pyZIlOv3004PP5fF4dMQRR+jaa6/VL37xixY1v7NmzdLPfvYzWWuj+vX66U9/qi+//FJLliyJaj0AAIg/b5lPU+aVy1/TEB99lX5NmVcuSUkRlmNyM59tcJ2kdyT9wGHJTkmexs/3Cfe61tpHrbUF1tqC7GzHUue0NWvWLP3nP//R5s2b9cknn+jggw/WmDFjdMIJJ6iqqko7d+7Uli1bNGTIEN10003asmWLtmzZol27dqmkpESStP/++2vhwoWaNm2aCgsL5fF4NHbsWH366afBD0nq2rWrHnjgAfXr109Sw41qTjerPf/889q5c6emT5+uiRMn6ogjjtBhhx2mQw89VC+++KK2bt2qQw89NPhxxBFH6L777gt5jvHjx+upp57S9OnTlZmZqauvvlp33NHyHyVOO+00PfXUU7H+ZQUAAAlUXFIRDMkB/po6FZdUJGhHodp9omyM+bWkr621f5OUKanSYdlKNZRbrJB0tKTk+NmnkAMOOEBPPfWUVqxYoY8//liDBw/Wc889J5fLpbq6umDt8dq1a3XTTTdp586dwe/t2bNnMOi6XC799re/lfRdp4YPP/xQf/vb31RUVBS83r17d3Xv3j3sfmpra/X73/9ehYWFOuKIIzRv3jy5XC516dJFxhgNGzZMmZmZmj9/vqTvptg1D9xDhw7VZZddJkmaOHGiTjzxRD3yyCO67bbbQtYddthhOuyww/b61w8AACRe8zILX6XzvVMbwlyPt1icKD8q6XJjzFuSXJL+Y4y5s9kab+OaeyRdrIYuGWijUaNGqbS0VG+//bbuu+8+uVwuSdIrr7yiXr16qVevXvr22291xRVXBL/u1auXNm/eLEm6+eab9frrr7d43u3bt+vee+/Vrl27gtfCnSIHPP7441q7dq32228/SQ2n0GeffbbcbrcyMjK0fPlyLViwQBkZGcrIyJDb7dbatWvldrvDPmeXLl10+umna+PGjaqpqdmrXyMAAJCcAmUWvkq/rBrKLMIljZxMT5hH4qvdQdlau81ae5a19jRr7bXW2tXW2qnN1uxQww19KySdbq3d3t7XTTe7du3S9773PS1evFg///nPQ7pNBG7is9aqsrJSZWVl2r17t5YuXSqpof63pqZG69at0+jRozVjxoyQ5w58f+/evaPay4YNGzR58uRgUA/o2rWrLrvsMtXW1spaq/r6etXW1mrNmjWqq6uLeELd9Ll79+7dIlDPmjUrbHDfs2ePJk2apD59+igrK0uTJ092rGX+v//7P+Xl5SkrK0vjx4/X73//e/Xp0yfk12PRokU6+eST5fF41L9/f91999109gAAIAacyiys1CIse9wuFRXmx21fkcRtrJ21dpu+63zRsW66Sfrww7i8VNSOOUZqFlCjVVtb22JU98MPPyxJysnJ0ZNPPhm8vmLFCn3/+9/XmjVrgtfcbrfcbrfmzp2rW265RTNmzNBVV13V4nV69OjR6l7q6up05ZVXKisrSyeddFLIYy6XS7W1tSFlH5K0e/fu4OPNBWqrq6urNX/+fM2dO1fjxo1rdR9NXXvttZo5c6auvvpqDRw4UA888ID++9//6vjjjw+umTt3roqKinTLLbcoLy9Pd999t7KysvTnP/9ZAwcOlCQtXrxYhYWFuuCCCzR+/HitXr1akydP1u7duzVt2rQ27QkAAIQKV05hJeVmejpv1wt0rIyMDK1fv14ej0f/+Mc/NHHiRH311Ve65pprWoxNrqqqUpcuXdS/f/9gyUVTd999t375y19q3333DV4LlFxEc+JbWVkpn8+nP//5z/rLX/7S4vHZs2dr9uzZUf/cJk2apEmTJgW/Puecc1qceEfy3//+V7NmzdLPf/5zPfLII5Kk8847T/n5oX8TXbp0qY477jjdddddkhr6P99yyy269NJLg2umTJmi4cOH66GHHpIkjRkzRl999ZUefvhhgjIAAO0UriY5N9OjZZNHJWBHreucQXkvT26T2YEHHiip4dTXGKPMzExt2bJFY8eODVnn9/vVt29fx9PbgLKyMg0fPlx79uyR1FDu0LNnz+D3BK476dOnj95991316tXLMShfeumlwaAZ8MUXX+i441rMoZEk/fKXv9To0aN17733aunSpZozZ4569eoV9vWbe//991VXV6cLL7wweO2www7TsGHDQtYVFBRo1qxZeuutt3TQQQfplVdeCbk5cNeuXXrvvfdkrZVTx5VvvvlGffr0iXpfAACkq3B9kYsK80NawUnJVWbhpHMG5TSxcOHCkB8ladOmTcG2bgFNa2zr6+t19dVX66yzzgrW8X7yySc66KCDgmuqqqpkrVVtba3j60YKss8++6yeffbZqH8OAwcO1JlnnqmePXtq2LBheuKJJ3TDDTdE/f2VlZWS1GKoSU5OTsgwlREjRoT82K9fP73wwgvBx7dt2yZrra655poWf/mQ1KL0BQAAtBRNX+RkHS7ihKDcCTQNtGvWrFH//qHzXKqqqoL1xy+//LLWr1+va665Rh6PR8YYXXnllRoyZIikhhPaww8/XM8995yqq6vbvJcrr7xSs2bNCrn26aefasCAyFPLTz75ZJ100km6//77df3114cMVYkkENq/+eabkOubNm0K+frqq6/WH/7wB5177rnaunWr/ud//kcez3d31GZlZckYo969e+vMM88MXt+8ebM+++wzbugDACAKkfoijzk2N/iRKmIycASJ1bVrVw0aNEhSw6S+Y445RlJDmcQPf/jDkG4Rf/zjH3XOOeeooKBAgwYNUteuXbVy5UoNHDhQ5513nnJzc5WVlaVDDz1UF1xwQZv38uSTTwZbywU+WgvJAZMmTdJnn32mV155JerXO/7442WM0d///vfgtfXr1+vtt98OWbdmzRp1795dhx9+uE444YSQkCw19Jo+4YQT9NJLL4WUnvz2t7/VyJEjo94PAADpLNwNe8nSF7mtOFHuBM444wz9+9//1j/+8Q998skn+sEPfqAJEybojjvukNfrDa6bM2eO3n//fS1fvjx47bbbbtN+++2ncePG6a9//asuvPBCvfXWWyosLFRhYWGb9zJu3LjgTXUBn3/+uY4++uhWv/fCCy/UQQcdpBkzZuiHP/xhVK934IEHhtRFH3HEEXrwwQdbnEgXFBTod7/7nTZt2qS8vDz16tVLhx56aPAvFVLDXyIKCws1fPhwXXnllfriiy/02GOP6Ve/+lWLYA0AQDoLV4cc7oa9ZOmL3FYE5RQTbhCHz+fThAkTdMEFF+jggw/WypUrNXToUJWUlCg/P1+bNm3SpEmTNGzYMA0dOlRSQ23znDlzNGPGDA0YMEAvvPCChg8frjvuuCNkjHTTQSRN1dfXq76+XmvXrtWePXu0c+dOud1u/ec//wlZt3HjRkkNJRhbt27VkUce6fh8GRkZmjhxom655RatWrUqqnAtSY899pgyMzM1e/Zs1dfX67LLLtOOHTu0fv364JpLL71U8+fP1wMPPKBvvvkm2C3kjDPO0MKFC2WM0RlnnKEFCxbo1ltv1a9+9Svl5OTozjvvDE4sBAAAkeuQU/GGvUiM02CGZFBQUGBLS0sjrvn444+DPXA7u/Lyct1333167733VF9fr3//+9/BxxYtWqTLL79c2dnZeuONN9S3b19VVVXp4osv1jvvvKMFCxYoNzdXP/nJT3TNNdfo4osv1po1azR06FDl5+dr2bJlysho+DvTxIkTVVZWpjfffFOvvfaarrvuOq1bt04zZ85s0Xu5sLBQ++yzjzIyMvTaa68pIyMjYm1xXV2dqqqqVFpaGiwViYe1a9cqPz9fN910kwYPHqyMjAzt3r1bXq9Xb7zxhrZs2RL1sJVI0un3IwAgfZ1y16KIbd7CnTYnK2PMSmttgeNjBOXU8O233yo3Nzc4LOOcc86RJE2YMEF//etf9aMf/UgzZ84M6Y+8Z88enX/++dq4caM++OADSQ3T+1wul6qrq/Xggw/qoosuCul4ETgV7tatm7Zv365JkybpjDPO0E9+8pMWk/FGjhypffbZR6+++mocfgX2Xl1dnaZNm6Z58+Zp3bp1qqqqUmZmpo477jjdcMMNOvfcc2PyOun0+xEAkD6aB1+nkCw1TNj74q7Y/D81ngjKnVhlZaWWL1+u0aNHOz6+e/dubdmyRXl5eXHeWfrh9yMAoLOZ6i3X7BXr1DQtGklO6TGZB4dEEiko0/UixWVmZoYNyVLDgBJCMgAAaCtvma9FSJYaQrJpdi2V65AjISgDAACgheKSCseTY6khLOdmemQaf5w+dnBS1yHvLbpeAAAAoIVIvY9TtcyirThRBgAAQAvheh8bqVOWWTghKAMAAKCFosJ8edyukGtG0riheZ2yzMIJpRcAAABpJppex4GvU6kncqwRlAEAANJIpMl6TmE5nYJxc5ReAAAApJHikoqQEdOS5K+pU3FJRYJ2lLwIyilk9erV2r59e7ufp7q6OuxjlZWVeuCBB7Rr166Iz7F582ZJDQNNrr/+ev3rX/+SJH355ZfBNY8++qjWrl3b6n6+/PJL/fOf/4xi5wAAoL3CdbOI1OUiXRGUU8i1116r0047TRs2bAi5/s0334T9no8++khfffVVyLU//vGPOu2007R79+4W65csWaIbbrhBq1evDvucmzZtUn5+vubNm6eamho9+OCD8vl8+uijj9S/f399/vnnqq6u1rXXXqtnn3221Z/Xyy+/rMsuuyz4dVVVlSorKyN+1NXVRXhGAAAQTrhuFuGupzOCcgp58cUX1aVLF5166qny+XzB66NHj9b1118vqSHEvvPOO8HHfvWrX+mRRx4Jfm2t1ezZs3XooYeqR48eqqurk9/vV319vSTppZde0qhRo3TiiSdKkurr61VVVaWqqqrgc+y///665557dM011wRPp7t166a77rpLY8eO1WGHHabVq1errq5OF110Uas/L4/Ho27dugW//tOf/qSsrKyIH9GcVAMAgJacull01sl67UVQTiF9+/bVwoUL5Xa7dfPNNwevezwe9ezZU5L05ptvatSo7xqAd+3aVV27dg1+vWDBAm3atEl/+tOfVF9fr6VLl6pHjx5yuVwyxuhvf/ubFi1aJGOMjDFyuVzyeDy66aabgs+xdOlSSVJRUZEWLlwoqeEkOi8vT0cddZSWLFmiJUuW6JBDDtHAgQOD31dfX+9Y9mFM6CDMbt26acSIEbLWtvjYtm2bJKl79+57+8sIAECn5i3z6ZS7FunQyf/QKXctkrfMF/L4mGNzNX3s4LSYrNdedL1IMX379tXrr7+u3r17B69169ZNLlfD3wybB8hA4A249957dcstt+iAAw7Qs88+q/vvv19lZWX63ve+p/nz52vixIlavXp1MHhba1VTUyO32x18jjfffFPz5s2T2+3W+++/L6nhJLpXr16qqalRbW2tPvzwQ3355ZctQvAll1yiOXPmSGooAcnIyNDKlSu1Y8cO3XPPPcGT69raWlVWVrb4+QdqtK0NN1QTAID0FW1Hi3TvZhEtgnIK2Llzp1577bXgyW9OTo7y8vKCj2dkZASDY/Ng2tSSJUtUUVEhr9crSbrvvvvk8Xh0+OGHq0ePHnr11Vf14x//WAcffHDE/UydOlVTp07VnXfeqc8//1xbtmzRb37zG9XX12vcuHHavn27+vXrp8cff1ynn366JOnMM8/UxRdfrGuuuSb4PJ9++qlcLpc2bdqk2tparV27VlVVVRowYICWLVumrKyssHtoWgoCAAAaROpoQTBuO4JyCti0aZOuuuoqeTweVVZW6pJLLtFTTz0VfLympiZYYxzpOX72s5/plFNO0TPPPKNPPvlEpaWlmj9/vvbdd9+QtTNnzpQkffHFFzrkkENaPJe1Vrfffrvuuusueb1ejR49WqtXr1ZxcbEyMzO1efNmVVdXKzc3N/j9W7du1YABA3TQQQcFn+fxxx+XJD322GP64osv9PDDD0uSZsyYoREjRmjJkiWSpI0bN+rII4/U0qVLNXjw4Db92gEAkE7oaBFb1CiH0Vp9Tzwddthh+vbbb7Vp0yYNGzYspAxCajhdDZRehNO9e3dt3rxZy5Yt0zPPPKP//d//1YQJE3TGGWfo66+/1v3336+DDz5YO3bsCN4M2KNHjxbPU1VVpe9///sqLi7WSy+9pOHDh0uShg4dqltvvVUzZswIBt5A54zq6mpt27YtJCQ7WbRokU477TTV1taG3ETYpUuXYMlFVVWV/H6/tm3bptra2ih+9QAASB90tIgtTpQdtGViTSI0D8q7du2SxxP5D8C+++6r9evXKysrS08//bQ+/PBD3X777XK5XDrggAP05JNP6qqrrlKvXr2Cz9WlS8u/R3Xv3l2//vWvVVxcrCFDhuj3v/+9brjhBp100kk655xz9Morr2jMmDE69dRT9e6770pSsJ3d4Ycf7rg3n8+n9evX6+KLL9Yf/vAHbd68WUuXLm3xcxoyZEjI12VlZTrmmGMi/rwBAOhsvGU+TXt5tSr9NZKkrB5u3XbeII05NldFhfkhGUaio0V7cKLsINkn1jSvQ/7000+1//77t/p9WVlZ2rFjhyZPnqy7775b2dnZkqSHH35YH3zwgU499VStWbMmODTk008/1erVq1VWVhbsNiFJ/fr1U319vf7973/r7rvvVl1dnb755ht98sknstZqypQpuvrqq/XWW2/JWqtVq1YpKysrpIyjpqZGc+bM0cknn6xp06apT58+qqio0NVXX63KykpdcMEF+vrrr/X111/rs88+kyQtX75cX3/9tTZs2KDPP/9cRx55ZDt/JQEASC3eMp+Knl8VDMmStG13jYpeWCVvmY+OFjHGibKDVKrvWb9+vb799lsdddRRUa2/8cYblZ+fr/Hjx0uS6urq9NFHH6lLly668MIL1aVLl+Awj3PPPTfYZ3nu3Ln64Q9/KEm68sor9cknn6i2tlZ79uzRnDlzNGfOHO3atUu9e/fWhg0btHXrVl155ZVasWKFli1bpqFDh4YEfGutfvvb3+rEE0/U+eefr7/85S/q06ePpIYBKgcddJAOOOAASQ03M0oNHT8C1wAASEfFJRWqqW/Z+ammzgZv2KOjRexwouwgFep7li9frt27d+u9995Tt27ddPzxx7f6PdOmTdOsWbN0wAEH6Pzzz1f//v118cUX684779T27dv1zTffaMuWLVq8eLEkqaKiQtu2bVN1dXUwJEtSaWmpduzYoWOPPVaTJk3Sli1btGXLFg0aNEiXXHKJunTpor59+2r06NG6//779fzzz+vss88O2UvXrl21fPlyzZ49O3iyHVBRUaGDDz5Y/fv3l8vlUmZmplwul4488khlZGTIGKO33norBr+KAACkhsC9U74Ih3bJeKCX6gjKDpJ9Ys2WLVs0duxYPfHEE3ruuec0atSo4I13kUY7d+3aVTk5Oaqurtbw4cN1//33a8aMGerdu7c2btyok08+WV988UVw/bfffqsTTjhBCxYsaPFcr7zyit555x3V1NTozTff1Jw5c7R69WrdcsstwTU33nij5syZo02bNumKK65o8Rx9+/Ztca26uloffPCBjjnmGPXs2VMzZ85UbW1tyIfEwBEAQPoI3DsVKSRLyXWg11kQlB0kc33P7t279eKLL6p///4aMWKE5s2bp6uvvjr4+J49e0LWBybaSdKUKVPk8/n0wgsv6JZbbtH++++v119/XdXV1brooou0bds27bPPPsHv7dWrlwYMGKArrrhCGzduDHne4cOHa+7cuaqurtYVV1yhSy+9VH369NHbb78dDOv9+vWTy+VS3759Iwb4pkpLS2Wt1QknnBCxJ7TTjYYAAHQmgVPkm577sMW9U825XSZpDvQ6E2qUw0jG+p7t27fr448/1v77769nnnlGl112mQYOHKjzzjsvuCY/P19Tp04Nfl1dXR0cG/3FF19o6dKlWrJkiUpKSrR161ZdcsklKikp0aZNm/T2228rOztb69atC37/Qw89pMGDB+uqq67S/Pnzg9ezsrJ00UUXKSsrS3//+9/14x//WIcccohuuOEGHXXUUfrss8901VVXady4cVq8eLFGjBihhQsXKje35a/pnj17gqH46aef1ogRI9SrVy9JDX8xcJrQBwBAZ9a8A1ckTbteILY4lksh1dXVOvDA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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x3 = np.array(X[:, 1].A1)\n",
    "f3 = model.predict(X).flatten()\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(12, 8))\n",
    "ax.plot(x3, f3, 'r', label='预测值Ridge')\n",
    "ax.scatter(data['X'], data['Y'], label='训练数据')\n",
    "ax.legend(loc=2, fontsize=18)\n",
    "ax.set_xlabel('X', fontsize=18)\n",
    "ax.set_ylabel('X', rotation=0, fontsize=18)\n",
    "plt.show()\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 最小二乘法(LSM)：\n",
    "\n",
    "最小二乘法的需要求解最优参数$w^{*}$：\n",
    "\n",
    "已知：目标函数\n",
    "\n",
    "$J\\left( w  \\right)=\\frac{1}{2m}\\sum\\limits_{i=1}^{m}{{{\\left( {h}\\left( {x^{(i)}} \\right)-{y^{(i)}} \\right)}^{2}}}$\n",
    "\n",
    "其中：${h}\\left( x \\right)={w^{T}}X={w_{0}}{x_{0}}+{w_{1}}{x_{1}}+{w_{2}}{x_{2}}+...+{w_{n}}{x_{n}}$\n",
    "\n",
    "将向量表达形式转为矩阵表达形式，则有$J(w )=\\frac{1}{2}{{\\left( Xw -y\\right)}^{2}}$ ，其中$X$为$m$行$n+1$列的矩阵（$m$为样本个数，$n$为特征个数），$w$为$n+1$行1列的矩阵(包含了$w_0$)，$y$为$m$行1列的矩阵，则可以求得最优参数$w^{*} ={{\\left( {X^{T}}X \\right)}^{-1}}{X^{T}}y$\n",
    "\n",
    "梯度下降与最小二乘法的比较：\n",
    "\n",
    "梯度下降：需要选择学习率$\\alpha$，需要多次迭代，当特征数量$n$大时也能较好适用，适用于各种类型的模型\n",
    "\n",
    "最小二乘法：不需要选择学习率$\\alpha$，一次计算得出，需要计算${{\\left( {{X}^{T}}X \\right)}^{-1}}$，如果特征数量$n$较大则运算代价大，因为矩阵逆的计算时间复杂度为$O(n^3)$，通常来说当$n$小于10000 时还是可以接受的，只适用于线性模型，不适合逻辑回归模型等其他模型"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "outputs": [],
   "source": [
    "def LSM(X, y):\n",
    "    w = np.linalg.inv(X.T@X)@X.T@y#X.T@X等价于X.T.dot(X)\n",
    "    return w"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "outputs": [
    {
     "data": {
      "text/plain": "matrix([[-0.00679208],\n        [ 3.        ]])"
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "final_w2=LSM(X, y)\n",
    "#感觉和批量梯度下降的theta的值有点差距\n",
    "final_w2"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "#梯度下降得到的结果是 matrix([[-3.24140214,  1.1272942 ]])"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 使用Pytorch 完成线性回归\n",
    "> 线性回归就是一个不加激活函数的全连接层"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "# 准备数据\n",
    "import numpy as np\n",
    "x_train = np.random.random((11,1))\n",
    "y_train = x_train * 3 + (np.random.random((11,1)) -0.5) * 0.001\n",
    "x_train = np.array(x_train,dtype=np.float32)\n",
    "y_train = np.array(y_train,dtype=np.float32)\n",
    "# x_train.dtype = np.float32\n",
    "\n",
    "print(x_train.dtype, x_train)\n",
    "print(y_train.dtype, y_train)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "class LinearRegressionNet(nn.Module):\n",
    "    def __init__(self,input_dim, output_dim):\n",
    "        super(LinearRegressionNet, self).__init__()\n",
    "        self.linear = nn.Linear(input_dim, output_dim)\n",
    "    def forward(self,x):\n",
    "        x = self.linear(x)\n",
    "        return x\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "net = LinearRegressionNet(1, 1)\n",
    "print(net)\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "epochs = 1000\n",
    "lr = 0.01\n",
    "optimizer = torch.optim.SGD(net.parameters(), lr=lr)\n",
    "criterion = nn.MSELoss() # 使用MSE损失函数\n",
    "\n",
    "for epoch in range(epochs):\n",
    "    inputs = torch.from_numpy(x_train)\n",
    "    labels = torch.from_numpy(y_train)\n",
    "    optimizer.zero_grad() # 梯度清0\n",
    "    output = net(inputs)\n",
    "    loss = criterion(output,labels)\n",
    "    loss.backward() # 反向传播\n",
    "    optimizer.step() # 更新权重 (基于学习率和梯度)\n",
    "    if epoch % 50 == 0:\n",
    "        print(f'epoch:{epoch}, loss:{loss.item()}')\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "# 预测\n",
    "test_data = torch.from_numpy(x_train).requires_grad_()\n",
    "print(test_data)\n",
    "pred = net(test_data).data.numpy()\n",
    "print(pred)\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "# 使用GPU训练\n",
    "device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')\n",
    "net.to(device) # 模型传入gpu\n",
    "# 数据传入\n",
    "inputs = torch.from_numpy(x_train).to(device)\n",
    "labels = torch.from_numpy(y_train).to(device)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}